package com.example.baidu_map_plugin.location;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.util.Log;


import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.example.baidu_map_plugin.permission.PermissionsListener;
import com.example.baidu_map_plugin.permission.PermissionsUtils;

import java.util.ArrayList;
import java.util.List;

import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry;
import io.flutter.plugin.common.PluginRegistry;


public class BaiduLocation extends BDAbstractLocationListener implements PluginRegistry.RequestPermissionsResultListener {
    private static final String TAG = BaiduLocation.class.getSimpleName();
    private Activity context;
    private LocationClient locationClient;
    private PermissionsUtils permissionsUtils;
    private LocationCallBack locationCallBack;

    public BaiduLocation(ShimPluginRegistry.Registrar registrar, LocationCallBack locationCallBack) {
        this.context = registrar.activity();
        this.locationCallBack = locationCallBack;
        permissionsUtils = new PermissionsUtils();
        registrar.addRequestPermissionsResultListener(this);
    }

    /**
     * 初始化定位参数配置
     */

    private void initLocationOption(Context context) {
//定位服务的客户端。宿主程序在客户端声明此类，并调用，目前只支持在主线程中启动
        locationClient = new LocationClient(context);
//声明LocationClient类实例并配置定位参数
        LocationClientOption locationOption = new LocationClientOption();

//注册监听函数
        locationClient.registerLocationListener(this);
//可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        locationOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选，默认gcj02，设置返回的定位结果坐标系，如果配合百度地图使用，建议设置为bd09ll;
        locationOption.setCoorType("bd09ll");
//可选，默认0，即仅定位一次，设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
        locationOption.setScanSpan(1000);
//可选，设置是否需要地址信息，默认不需要
        locationOption.setIsNeedAddress(true);
//可选，设置是否需要地址描述
        locationOption.setIsNeedLocationDescribe(true);
//可选，设置是否需要设备方向结果
        locationOption.setNeedDeviceDirect(false);
//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        locationOption.setLocationNotify(true);
//可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        locationOption.setIgnoreKillProcess(true);
//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        locationOption.setIsNeedLocationDescribe(true);
//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        locationOption.setIsNeedLocationPoiList(true);
//可选，默认false，设置是否收集CRASH信息，默认收集
        locationOption.SetIgnoreCacheException(false);
//可选，默认false，设置是否开启Gps定位
        locationOption.setOpenGps(true);
//可选，默认false，设置定位时是否需要海拔信息，默认不需要，除基础定位版本都可用
        locationOption.setIsNeedAltitude(false);
//设置打开自动回调位置模式，该开关打开后，期间只要定位SDK检测到位置变化就会主动回调给开发者，该模式下开发者无需再关心定位间隔是多少，定位SDK本身发现位置变化就会及时回调给开发者
        locationOption.setOpenAutoNotifyMode();
//设置打开自动回调位置模式，该开关打开后，期间只要定位SDK检测到位置变化就会主动回调给开发者
        locationOption.setOpenAutoNotifyMode(3000, 1, LocationClientOption.LOC_SENSITIVITY_HIGHT);
//需将配置好的LocationClientOption对象，通过setLocOption方法传递给LocationClient对象使用
        locationClient.setLocOption(locationOption);
//开始定位
        locationClient.start();
    }

    public void startLocation() {

        List<String> permissions = new ArrayList<>();
        permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
        permissionsUtils.withActivity(context).setPermissionsListener(new PermissionsListener() {
            @Override
            public void onDenied(List<String> deniedPermissions, List<String> grantedPermissions) {
                // TODO: 2020/5/23
            }

            @Override
            public void onGranted() {
                Log.d(TAG, "BaiduLocationListener--startLocation()--onGranted():");
                initLocationOption(context);
            }
        }).getPermissions(context, 1001, permissions);
    }


    /**
     * 实现定位回调
     */
    @Override
    public void onReceiveLocation(BDLocation location) {
        Log.e(TAG, "BaiduLocationListener--onReceiveLocation():location=" + location.getCity());
        if (locationCallBack != null) {
            locationCallBack.onLocationCallBack(location);
        }
    }

    @Override
    public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        Log.e(TAG, "BaiduLocationListener--onRequestPermissionsResult():requestCode=" + requestCode + ",permissions=" + permissions + ",grantResults=" + grantResults);
        permissionsUtils.dealResult(requestCode, permissions, grantResults);
        return false;
    }

    public interface LocationCallBack {
        public void onLocationCallBack(BDLocation location);
    }

}
